package com.tim.arc.dubbo;

import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.extension.ExtensionLoader;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.cluster.Cluster;

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * @Description:
 * @Version 1.0, 2021/11/23
 * @Author Tim
 */
public class DubboDemo {
    public static void main(String[] args) {

    }

    public void export() throws InterruptedException {
        // 服务实现
        UserService demoService = new UserServiceImpl();
        // 当前应用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("demo-provider");
        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://127.0.0.1:2181");
        // 服务提供者协议配置
        ProtocolConfig UserService = new ProtocolConfig();
        UserService.setName("dubbo");
        UserService.setPort(12345);
        UserService.setThreads(200);
        // 注意：ServiceConfig为重对象，内部封装了与注册中心的连接，以及开启服务端口
        // 服务提供者暴露服务配置
        ServiceConfig<UserService> service = new ServiceConfig<UserService>();
        // 此实例很重，封装了与注册中心的连接，请自行缓存，否则可能造成内存和连接泄漏
        service.setApplication(application);
        service.setRegistry(registry); // 多个注册中心可以用setRegistries()
        service.setProtocol(UserService); // 多个协议可以用setProtocols()
        service.setInterface(UserService.class);
        service.setRef(demoService);
        service.setVersion("1.0.0");
        // 暴露及注册服务
        service.export();
        new CountDownLatch(1).await();
    }

    
    public void ref(){
        // cluster接口
        Cluster cluster = ExtensionLoader.getExtensionLoader(Cluster.class)
                .getExtension(Cluster.DEFAULT, true);
        System.out.println(cluster);
    }

    
    public void spi(){
        ExtensionLoader extensionLoader=ExtensionLoader.getExtensionLoader(Protocol.class);
        // 无包装实现类，返回原类；有包装类，返回层级装饰后的类。
        Object extensionOrWrapper = extensionLoader.getExtension("dubbo");
        System.out.println(extensionOrWrapper);
        // 获取@SPI标记的默认实现
        Object defaultExtension = extensionLoader.getDefaultExtension();// 默认
        System.out.println(defaultExtension);
        // 获取自适应类；自适应类在执行中，通过url参数定位到具体实现类。命令模式？
        Object adaptiveExtension = extensionLoader.getAdaptiveExtension();// 自适应的代理实例
        System.out.println(adaptiveExtension);
        // 按url参数，获取激活的类
        List activateExtension = extensionLoader.getActivateExtension((URL) null, (String[]) null);// 激活
        System.out.println(activateExtension);

    }


}
